Halogen Hooksの内部実装
Halogenの内部実装に影響はない
それからも分かる通り、HooksはComponentでやっていたようなmkComponentなどのことを隠蔽している
Hook
UseHookFで構成されている
built-in hooksを提供する
evalHook関数によって、HookからHalgenMに変換される
HookM
HookFで構成されている
evalHookMによて、HookMからHalogenMに変換される
code:dir
Hooks.purs -- built-in hooks の定義
Hooks
Hook.purs -- Hook自由モナド の定義
HookM.purs -- HookF型と、 HookM自由モナド の定義
Types.purs
Component.purs
Internal
Types.js
Eval.purs -- evalHook や evalHookM の定義
Types.purs
UseHookF.purs -- UseHookF型 の定義
Eval
Types.purs
Hook
code:Hook.purs(hs)
newtype Hook :: (Type -> Type) -> HookType -> Type -> Type
newtype Hook m h a = Hook (Free (UseHookF m) a)
type role Hook representational nominal representational
derive instance Functor (Hook m h)
、によって、順序を保つ
これ結局今は使ってないっぽいなmrsekut.icon
UseHookF
code:UseHookF.purs(hs)
data UseHookF m a
= UseState StateValue ((StateValue /\ StateId StateValue) -> a)
| UseEffect (Maybe MemoValues) (HookM m (Maybe (HookM m Unit))) a
| UseQuery (QueryToken QueryValue) (forall b. QueryValue b -> HookM m (Maybe b)) a
| UseMemo MemoValues (Unit -> MemoValue) (MemoValue -> a)
| UseRef RefValue ((RefValue /\ Ref RefValue) -> a)
derive instance :: Functor (UseHookF m)
Hook Free Monadを構成するので、このUseHookFはFunctorになっているmrsekut.icon
HookM
HookFで、HalogenM内でできる操作をDSLとして定義している
code:HookM.purs(hs)
data HookF m a
= Modify (StateId StateValue) (StateValue -> StateValue) (StateValue -> a)
| Subscribe (H.SubscriptionId -> HS.Emitter (HookM m Unit)) (H.SubscriptionId -> a)
| Unsubscribe H.SubscriptionId a
| Lift (m a)
| ChildQuery (CQ.ChildQueryBox SlotType a)
| Raise OutputValue a
| Par (HookAp m a)
| Fork (HookM m Unit) (H.ForkId -> a)
| Kill H.ForkId a
| GetRef H.RefLabel (Maybe DOM.Element -> a)
derive instance :: Functor m => Functor (HookF m)
newtype HookM m a = HookM (Free (HookF m) a)
-- この後、monadまでderivingしている
参考